using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Sampling
{
    /// <summary>
    /// <para>Generate Transects Along Lines</para>
    /// <para>Creates perpendicular transect lines at a regular interval along lines.</para>
    /// <para>沿线以规则间隔创建垂直横断线。</para>
    /// </summary>    
    [DisplayName("Generate Transects Along Lines")]
    public class GenerateTransectsAlongLines : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public GenerateTransectsAlongLines()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_features">
        /// <para>Input Features</para>
        /// <para>The line features along which perpendicular transect lines will be generated.</para>
        /// <para>将沿其生成垂直横断线的线要素。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The output perpendicular transect lines generated along the input features.</para>
        /// <para>沿输入要素生成的输出垂直横断带线。</para>
        /// </param>
        /// <param name="_interval">
        /// <para>Distance Between Transects</para>
        /// <para>The interval from the beginning of the feature at which transects will be placed.</para>
        /// <para>从要素开始开始放置横断面的时间间隔。</para>
        /// </param>
        /// <param name="_transect_length">
        /// <para>Transect Length</para>
        /// <para><xdoc>
        ///   <para>The length or width of the transect line. Each transect will be placed in such a way along the input line that half its length falls on one side of the line, and half its length falls on the other side of the line.</para>
        ///   <para>This is the overall length of each transect line, not the distance that the transect extends from the input line. To specify how far the transect line should extend from the input line—for example, 100 meters—double this value to specify the transect length (200 meters).</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>横断面线的长度或宽度。每个样带将沿着输入线放置，使其长度的一半落在线的一侧，一半的长度落在线的另一侧。</para>
        ///   <para>这是每条样线的总长度，而不是样带从输入线延伸的距离。要指定样带线应从输入线延伸多远（例如，100 米），请将此值加倍以指定横断面长度（200 米）。</para>
        /// </xdoc></para>
        /// </param>
        public GenerateTransectsAlongLines(object _in_features, object _out_feature_class, string? _interval, string? _transect_length)
        {
            this._in_features = _in_features;
            this._out_feature_class = _out_feature_class;
            this._interval = _interval;
            this._transect_length = _transect_length;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Generate Transects Along Lines";

        public override string CallName => "management.GenerateTransectsAlongLines";

        public override List<string> AcceptEnvironments => ["workspace"];

        public override object[] ParameterInfo => [_in_features, _out_feature_class, _interval, _transect_length, _include_ends.GetGPValue()];

        /// <summary>
        /// <para>Input Features</para>
        /// <para>The line features along which perpendicular transect lines will be generated.</para>
        /// <para>将沿其生成垂直横断线的线要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The output perpendicular transect lines generated along the input features.</para>
        /// <para>沿输入要素生成的输出垂直横断带线。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Distance Between Transects</para>
        /// <para>The interval from the beginning of the feature at which transects will be placed.</para>
        /// <para>从要素开始开始放置横断面的时间间隔。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Distance Between Transects")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public string? _interval { get; set; }


        /// <summary>
        /// <para>Transect Length</para>
        /// <para><xdoc>
        ///   <para>The length or width of the transect line. Each transect will be placed in such a way along the input line that half its length falls on one side of the line, and half its length falls on the other side of the line.</para>
        ///   <para>This is the overall length of each transect line, not the distance that the transect extends from the input line. To specify how far the transect line should extend from the input line—for example, 100 meters—double this value to specify the transect length (200 meters).</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>横断面线的长度或宽度。每个样带将沿着输入线放置，使其长度的一半落在线的一侧，一半的长度落在线的另一侧。</para>
        ///   <para>这是每条样线的总长度，而不是样带从输入线延伸的距离。要指定样带线应从输入线延伸多远（例如，100 米），请将此值加倍以指定横断面长度（200 米）。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Transect Length")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public string? _transect_length { get; set; }


        /// <summary>
        /// <para>Generate transects at line start and end</para>
        /// <para><xdoc>
        ///   <para>Specifies whether transects will be generated at the start and end of the input line.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—Transects will be generated at the start and end of the input line.</bullet_item><para/>
        ///     <bullet_item>Unchecked—Transects will not be generated at the start and end of the input line. This is the default.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否在输入线的起点和终点生成横断面。</para>
        ///   <bulletList>
        ///     <bullet_item>选中 - 将在输入线的起点和终点生成横断面。</bullet_item><para/>
        ///     <bullet_item>未选中 - 不会在输入线的起点和终点生成横断面。这是默认设置。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Generate transects at line start and end")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _include_ends_value _include_ends { get; set; } = _include_ends_value._false;

        public enum _include_ends_value
        {
            /// <summary>
            /// <para>END_POINTS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("END_POINTS")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_END_POINTS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_END_POINTS")]
            [GPEnumValue("false")]
            _false,

        }

        public GenerateTransectsAlongLines SetEnv(object workspace = null)
        {
            base.SetEnv(workspace: workspace);
            return this;
        }

    }

}